

 /**
  * @method 获取内部组件
  * @param {string} url chrome.extension.getURL转换后的组件地址
  * @param {*} res chrome通讯回调函数
  */
 function getTemplate(url, res) {
  requestGet(url, '')
  .then(result => {
    res(result)
  })
}

/**
 * @method 获取url的id参数
 * @param {string} url location.href
 * @returns {array} [域名, 商品id]
 */
function getTmallId(url) {
  let id = ''
  url.split('?')[1].split('&').forEach(params => {
    if (params.split('=')[0] === 'id') {
      id = params.split('=')[1]
    }
  })
  return [url.split('?')[0], id]
}

/**
 * @method 重置数据状态
 */
function reset() {
  data = []
  tabId = -1
  currentIndex = 0
  currentSkuIndex = 0
  targetUrl = ''
  failList = []
  noStandardsList = []
}

/**
 * @method 采集完成
 */
function finish() {
  console.log('finish')
  showDataOnPage('搬家助手', '采集完成')
  if (noStandardsList.length > 0) {
    alert(`此次爬取共有${noStandardsList.length}个不符合标准的商品(无价格无数量)`)
  }
  if (failList.length > 0) {
    if (confirm(`此次爬取共有${failList.length}个失败案列，是否将失败案例重新上传？`)) {
      failList.forEach(product => {
        uploadData(product)
      })
    }
  }
  reset()
}

/**
 * @method 显示一个桌面通知
 * @param {string} title
 * @param {string | number} data 
 */
function showDataOnPage(title, data) {
  if (window.webkitNotifications) {
    var notification = window.webkitNotifications.createNotification(
      'assets/icons/icon48.png', // icon url - can be relative
      title, // notification title
      data // notification body text
    )
    notification.show() 
    // 设置3秒后，将桌面通知dismiss
    setTimeout(function() { notification.cancel() }, 3000)
  } else if (chrome.notifications) {
    var opt = {
      type: 'basic',
      title: title,
      message: data ? data.toString() : '',
      iconUrl: 'assets/icons/icon48.png',
    }
    chrome.notifications.create('', opt, function(id) {
      setTimeout(function() {
        chrome.notifications.clear(id)
      }, 3000)
    })
  } else {
    alert('您的浏览器不支持啊！')
  }
}

/**
 * @method id前缀过滤器
 * @param {string} url location.href
 * @returns {string} id标识
 */
function idFilter(url) {
  if (url.indexOf('jd.com/') !== -1) {
    return 'jd_'
  } else if (url.indexOf('1688.com/') !== -1) {
    return '1688_'
  } else if (url.indexOf('tmall.com/') !== -1) {
    return 'tmall_'
  } else if (url.indexOf('taobao.com/') !== -1) {
    return 'taobao_'
  } else {
    return ''
  }
}

/**
 * @method 将数字转换为字符串
 * @param {string} v 数字字符串
 * @returns {string} 给字符串加上双引号
 */
function replaceOverflow(v) {
  return String(Number(v)) === v ? v : `"${v}"`
}

/**
 * @method 判断图片是否已上传过 进行缓存(爬取一次之后缓存会清空)
 * @param {string} url 图片地址
 * @returns {string} 转存后的图片地址
 */
function baseUrlToBlob(url) {
  if (url.startsWith('//')) url = 'http:' + url
  if (!imgsCache[url]) imgsCache[url] = uploadImg(0, url)
  return imgsCache[url]
}

/**
 * @method 将图片上传至服务器
 * @param {number} times 标识
 * @param {string} url 图片地址
 * @returns {string} 转存后的图片地址
 */
async function uploadImg (times, url) {
  const reqUrl = '/file/img/url_convert'
  const reqData = {
    urlString: url,
    prefix: env === 'prod' ? 'operation/product' : 'test'
  }
  let result = await requestGet(null, reqUrl, reqData)
  try {
    let parseData = JSON.parse(result)
    if (parseData.code !== 200) {
      showDataOnPage('图片转存失败', parseData.msg)
    } else {
      return parseData.data
    }
  } catch(err) {
    if (times === 2) {
      let errMsg = ''
      err.code === 401 ? errMsg = '登录过期 请到商家后台刷新重试' : null
      showDataOnPage('图片转存失败', errMsg ? errMsg : err.status)
    } else {
      uploadImg(++times, url)
    }
  }
}

/**
 * @method 接口指令
 * @param {string} origin 域名
 * @param {string} url 接口地址
 * @param {object} query 上传参数
 */
function requestGet(origin, url, query) {
  return new Promise((resolve, reject) => {
    $.ajax({
      type: 'get',
      url: (origin ? origin : uploadRequestUrl) + url,
      data: query ? query : '',
      headers: { ...userInfo },
      contentType: 'application/json; charset=utf-8',
      async: false,
      dataType: 'text',
      success: function (res) {
        resolve(res)
      },
      error: function(err) {
        reject(err.status)
      }
    })
  })
}

function requestPost(origin, url, query, callback) {
  $.ajax({
    type: 'post',
    url: (origin ? origin : uploadRequestUrl) + url,
    headers: { ...userInfo },
    data: JSON.stringify(query),
    contentType: 'application/json; charset=utf-8',
    async: false,
    dataType: 'json',
    success: function (res) {
      if (res.code !== 200) {
        showDataOnPage(res.msg, res.code)
      } else {
        callback(res)
      }
    },
    error: function(err) {
      showDataOnPage('网络错误', err.status)
    }
  })
}


/**
 * @description 获取图片流 (异步)
 * @param {string} url 接口地址
 * @param {*} callback 回调函数
 */
function getFile(url, callback) {
  var xhr = new XMLHttpRequest()
  xhr.open('POST', url, true)
  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
  xhr.responseType = 'blob' // 返回类型blob
  // 定义请求完成的处理函数，请求前也可以增加加载框/禁用下载按钮逻辑
  xhr.onload = function () {
    if (this.status === 200) {
      var blob = this.response
      var reader = new FileReader()
      reader.readAsDataURL(blob) // 转换为base64，可以直接放入a表情href
      reader.onload = function (e) {
        if (callback) callback(reader.result)
      }
    }
  }
  // 发送ajax请求
  xhr.send()
}